/**
* <p>Title: JschUtils.java</p>
* <p>Description: </p>
* <p>Company: www.huoyunren.com</p>
* @author duanxiangyun
* @date 2015年4月29日
* @version 1.0
*/
package com.duan.test.utils.common;

import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import com.jcraft.jsch.*;
import org.apache.log4j.Logger;
/**
 * jsch封装类：用于远程主机ssh连接等
 */
public class JschUtils {
	
	private static final Logger log = Logger.getLogger(JschUtils.class);

	/**
	 * 利用JSch包实现远程主机SHELL命令执行
	 * @param ip 主机IP
	 * @param user 主机登陆用户名
	 * @param psw  主机登陆密码
	 * @param port 主机ssh2登陆端口，如果取默认值，传-1
	 * @param privateKey 密钥文件路径
	 * @param passphrase 密钥的密码
	 * @return Session
	 */
	public static Session sshShell(String ip, String user, String psw
	        ,String port ,String privateKey ,String passphrase) throws Exception{
	    Session session = null;
//	    Channel channel = null; 
	    JSch jsch = new JSch();	 
	    //设置密钥和密码
	    if (privateKey != null && !"".equals(privateKey)) {
	        if (passphrase != null && !"".equals(passphrase)) {
	            //设置带口令的密钥
	            jsch.addIdentity(privateKey, passphrase);
	        } else {
	            //设置不带口令的密钥
	            jsch.addIdentity(privateKey);
	        }
	    }
	     
	    if(Integer.parseInt(port) <=0){
	        //连接服务器，采用默认端口
	        session = jsch.getSession(user, ip);
	    }else{
	        //采用指定的端口连接服务器
	        session = jsch.getSession(user, ip ,Integer.parseInt(port));
	    }
	 
	    //如果服务器连接不上，则抛出异常
	    if (session == null) {
	        throw new Exception("session is null");
	    }
	     
	    //设置登陆主机的密码
	    session.setPassword(psw);//设置密码   
	    //设置第一次登陆的时候提示，可选值：(ask | yes | no)
	    session.setConfig("userauth.gssapi-with-mic", "no");
	    session.setConfig("StrictHostKeyChecking", "no");
	    //设置登陆超时时间   
	    session.connect(30000);
	    return session;
	}
	
	         
//	    try {
//	        //创建sftp通信通道
//	        channel = (Channel) session.openChannel("shell");
//	        channel.connect(1000);
//	 
//	        //获取输入流和输出流
//	        InputStream instream = channel.getInputStream();
//	        OutputStream outstream = channel.getOutputStream();
//	         
//	        //发送需要执行的SHELL命令，需要用\n结尾，表示回车
//	        String shellCommand = "ls \n";
//	        outstream.write(shellCommand.getBytes());
//	        outstream.flush();
//	 
//	 
//	        //获取命令执行的结果
//	        if (instream.available() > 0) {
//	            byte[] data = new byte[instream.available()];
//	            int nLen = instream.read(data);
//	             
//	            if (nLen < 0) {
//	                throw new Exception("network error.");
//	            }
//	             
//	            //转换输出结果并打印出来
//	            String temp = new String(data, 0, nLen,"iso8859-1");
//	            System.out.println(temp);
//	        }
//	        outstream.close();
//	        instream.close();
//	    } catch (Exception e) {
//	        e.printStackTrace();
//	    } finally {
//	        session.disconnect();
//	        channel.disconnect();
//	    }
//	}
//		static int lport;
//	    static String rhost;
//	    static int rport;
//	    public static void go(){
//	        String user = "jiyin";
//	        String password = "19821012";
//	        String host = "172.16.1.20";
//	        int port=22;
//	        try
//	            {
//	            JSch jsch = new JSch();
//	            jsch.addIdentity("D:\\资料\\汇通工作文档\\demo数据库连接秘钥","19821012");
//	            Session session = jsch.getSession(user, host, port);
//	            lport = 0;
//	            rhost = "rdsvmmqeavyffez.mysql.rds.aliyuncs.com";
//	            rport = 3306;
//	            session.setPassword(password);
//	            session.setConfig("userauth.gssapi-with-mic", "no");
//	            session.setConfig("StrictHostKeyChecking", "no");
//	            System.out.println("Establishing Connection...");
//	            session.connect(50000);
//	            System.out.println(session.getHostKey().getKey());
////	            int assinged_port=session.setPortForwardingL(lport, rhost, rport);
////	            System.out.println("localhost:"+assinged_port+" -> "+rhost+":"+rport);
//	            }
//	        catch(Exception e){
//	        	System.err.print(e);}
//	    }

	/**
	 * 本地端口是否被占用?
	 * @param port
	 * @return  true:already in using  false:not using
	 */
	public static boolean isLoclePortUsing(int port){  
        boolean flag = true;  
        try {  
            flag = isPortUsing("127.0.0.1", port);  
        } catch (Exception e) {  
        }  
        return flag;  
    }  
    /*** 
     * 主机IP的端口是否被占用?
     * @param host 
     * @param port 
     * @return  true:already in using  false:not using
     * @throws UnknownHostException  
     */  
    public static boolean isPortUsing(String host,int port) throws UnknownHostException{  
        boolean flag = false;  
        InetAddress theAddress = InetAddress.getByName(host);  
        try {  
            @SuppressWarnings("unused")
			Socket socket = new Socket(theAddress,port);  
            flag = true;  
        } catch (IOException e) {    
        }  
        return flag;  
    }  
    /**
     * 得到本地没有使用的端口
     * @return int
     */
    public static int getLocleNotUsingPort () {
    	 int ran;
    	 while (true) {
    		 ran = (int)(Math.random()*99999 +1);
    		 if (!isLoclePortUsing(ran)) {
    			break;
    		 }
    	 }
    	 log.info("指定本地连接端口:"+ran);
//    	 System.out.print("找到可用端口:"+ran);
    	 return ran;
    }
}
